[新機能] Amazon Bedrock 生成AI向けAmazon Redshift ML 統合を試してみました
AWS事業本部コンサルティング部の石川です。AWS が生成 AI 向けに Amazon Redshift と Amazon Bedrock の統合を発表しました。この新機能は、Redshift ML機能を拡張し、SQLで簡単にBedrockの大規模言語モデル(LLM)を利用できるようになります。早速、Redshiftで生成AIを試してみます。
Amazon Bedrock と Amazon Redshift ML の統合とは
Amazon Redshiftは、Redshift ML機能を拡張し、大規模言語モデル(LLM)との統合をサポートするようになりました。この拡張の一環として、RedshiftはAmazon Bedrockとのネイティブ統合を実現しました。この統合により、Amazon Redshift内のデータと共にシンプルなSQLコマンドからLLMを使用できるようになり、生成AIアプリケーションを迅速に構築が可能になりました。
この新しい統合により、AnthropicのClaude、Amazon Titan、MetaのLlama 2、Mistral AIなどの人気のある基盤モデル(FM)を使用して、Redshiftデータに対して言語翻訳、テキスト要約、テキスト生成、顧客分類、感情分析などの生成AIタスクを実行できるようになりました。
Redshift の購買履歴から LLMで商品をリコメンドしてみる
検証シナリオ
以下の2つのテーブルから返品した売上を除いた総売上のトップ10の顧客に対して、過去に購入した商品を基におすすめ商品をリコメンドの文章を生成します。
テーブルやデータのサンプルは、以下のとおりです。
売上データ(orders)
dev=# show table orders;
Show Table DDL statement
--------------------------------------------------------
CREATE TABLE public.orders ( +
row_id bigint ENCODE az64, +
order_id character varying(16383) ENCODE lzo, +
order_date date ENCODE az64, +
ship_date date ENCODE az64, +
ship_mode character varying(16383) ENCODE lzo, +
customer_id character varying(16383) ENCODE lzo, +
customer_name character varying(16383) ENCODE lzo,+
segment character varying(16383) ENCODE lzo, +
country character varying(16383) ENCODE lzo, +
city character varying(16383) ENCODE lzo, +
state character varying(16383) ENCODE lzo, +
postal_code bigint ENCODE az64, +
region character varying(16383) ENCODE lzo, +
product_id character varying(16383) ENCODE lzo, +
category character varying(16383) ENCODE lzo, +
sub_category character varying(16383) ENCODE lzo, +
product_name character varying(16383) ENCODE lzo, +
sales double precision ENCODE raw, +
quantity bigint ENCODE az64, +
discount double precision ENCODE raw, +
profit double precision ENCODE raw +
) +
DISTSTYLE AUTO;
(1 行)
売上データ(orders)の例は、以下のとおりです。
dev=# select * from orders limit 1;
-[ RECORD 1 ]-+--------------------------
row_id | 4801
order_id | US-2016-148901
order_date | 2016-05-14
ship_date | 2016-05-19
ship_mode | Standard Class
customer_id | MK-17905
customer_name | Michael Kennedy
segment | Corporate
country | United States
city | Jacksonville
state | Florida
postal_code | 32216
region | South
product_id | OFF-AR-10002467
category | Office Supplies
sub_category | Art
product_name | Dixon Ticonderoga Pencils
sales | 4.768
quantity | 2
discount | 0.2
profit | 0.4172
返品データ(returned)
dev=# show table returns;
Show Table DDL statement
---------------------------------------------------
CREATE TABLE public.returns ( +
returned character varying(16383) ENCODE lzo,+
order_id character varying(16383) ENCODE lzo +
) +
DISTSTYLE AUTO;
(1 行)
返品データ(returned)の例は、以下のとおりです。
dev=# select * from returns limit 1;
-[ RECORD 1 ]------------
returned | Yes
order_id | CA-2017-153822
Base Models(基盤モデル)へのアクセスを設定
Bedrockを初めて利用する際は、事前に以下のマネジメントコンソールのモデルアクセスより、基盤モデルへのアクセスリクエストが必要になります。
詳細は以下のブログをご確認ください。
補足: より多く、早くBase Models(基盤モデル)を使いたい場合
執筆時点(2024/11/02時点)では、リージョンによって利用できるBase Models(基盤モデル)が異なります。最も早く、より多くのBase Models(基盤モデル)をサポートしているのは、オレゴンリージョンやバージニアリージョンです。今回ご紹介する機能を、検証したい場合はこれらのリージョンで行う様々なBase Models(基盤モデル)をご利用可能です。
プロンプトの準備
システムプロンプトとユーザープロンプトは以下のとおりです。システムプロンプトはRedshiftの「MODEL」として定義します。一方、ユーザープロンプトは、Redshiftのレコードの内容に基づき文章を作ります。ユーザープロンプトは、レコードごとのプロンプトです。
システムプロンプト
あなたは、大手通販企業「Shinano」の営業です。
ユーザープロンプト
<customer_name>さんは、過去に<purchase_history>などを購入しています。このお客様に嗜好を分析して他に商品をおすすめする文章を作成してください。
補足: システムプロンプトとユーザープロンプトとは
生成AIのプロンプトは、主にシステムプロンプトとユーザープロンプトの2つの要素から構成されています。システムプロンプトは、AIの基本的な設定や動作指針を定義するもので、AIの役割や性格の設定、タスクの指示や目的の明確化、応答の形式や制約の指定などを含みます。これはAIの全体的な動作や応答の質を大きく左右する重要な要素です。
一方、ユーザープロンプトは、ユーザーが実際に入力する質問や指示のことを指します。これには具体的な質問や要求、タスクの詳細、追加の情報や文脈などが含まれます。ユーザープロンプトは、システムプロンプトによって設定された枠組みの中で、AIに特定のタスクを実行させるための直接的な指示を提供します。
システムプロンプトとユーザープロンプトを適切に組み合わせることで、AIからより精度の高い、目的に沿った応答を引き出すことが可能になります。システムプロンプトがAIの基本的な振る舞いを決定し、ユーザープロンプトがその都度の具体的なタスクを指示するという関係性があり、両者が相互に作用することでAIの出力が形成されます。
Amazon Bedrock上のLLMモデルを参照するモデルの作成
MODEL「customer_recommendations」を作成します。MODEL_IDとPROMPTを設定します。
MODEL_IDは、Amazon Bedrock ベースモデル IDs (オンデマンドスループット)の一覧から探してください。今回は、Anthropic社のClaude 3.5 Sonnetを利用するため、anthropic.claude-3-5-sonnet-20240620-v1:0
を設定します。
PROMPTには、LLMの動作や役割を定義するシステムプロンプトを設定します。
dev=# CREATE EXTERNAL MODEL customer_recommendations
FUNCTION customer_recommendations_func
IAM_ROLE 'arn:aws:iam::123456789012:role/dev-redshift-ap-northeast-1-123456789012'
MODEL_TYPE BEDROCK
SETTINGS (
MODEL_ID 'anthropic.claude-3-5-sonnet-20240620-v1:0',
PROMPT 'あなたは、大手通販企業「Shinano」の営業です。:');
CREATE MODEL
簡単なテストとして、この営業さんに「おはようございます!」と声をかけますと、営業さんらしい返事が返ってきました。SQLで生成AIを利用するには、customer_recommendations_func()関数にユーザープロンプトを渡すだけです。
dev=# SELECT customer_recommendations_func('おはようございます!');
-[ RECORD 1 ]-----------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
customer_recommendations_func | おはようございます。Shinano営業部の者です。本日はどのようなご用件でしょうか?弊社の商品やサービスについてご質問がございましたら、喜んでお答えいたします。お客様のニーズに合った最適なソリューションをご提案できるよう努めさせていただきます。
プロンプトの送信とパーソナライズされた結果の生成
実際のユースケースをイメージできるように、お客様に合わせた「商品のご提案」を生成するSQLは以下のとおりです。Redshift上の構造化データからユーザープロンプトを作成して、customer_recommendations_func()関数にユーザープロンプトを渡して、パーソナライズしたリコメンドを生成しています。
いわゆる、Amazon Redshiftのデータを利用したRAG(Retrieval-Augmented Generation)の例になります。
/* 売上トップ10のcustomer_idをリストアップ */
WITH
top10_customer_ids AS (
SELECT
o.customer_id
FROM
orders o
LEFT OUTER JOIN returns r ON (o.order_id = r.order_id)
WHERE
r.returned IS NULL
GROUP BY
o.customer_id, o.customer_name
ORDER BY
sum(o.sales) DESC
LIMIT 10
),
/* ユーザープロンプト生成 */
user_prompts AS (
SELECT
customer_id,
customer_name,
LISTAGG(replace(product_name, ',', ''),',') AS purchase_history,
customer_name||'さんは、過去に'||purchase_history||'などを購入しています。このお客様に嗜好を分析して他に商品をおすすめする文章を作成してください。' AS customer_prompt
FROM orders
WHERE customer_id IN (SELECT * FROM top10_customer_ids)
GROUP BY customer_id, customer_name
)
/* リコメンドの生成 */
SELECT
customer_id,
customer_name,
purchase_history,
customer_recommendations_func(
customer_prompt,
object('temperature', 0.2)
) as recommend_message
FROM user_prompts
;
実際の実行結果は、以下のとおりです。クエリの実行とLLMへの問い合わせ時間(10レコード)を含め、14秒程度でした。
dev=# /* 売上トップ10のcustomer_idをリストアップ */
WITH
top10_customer_ids AS (
SELECT
o.customer_id
FROM
orders o
LEFT OUTER JOIN returns r ON (o.order_id = r.order_id)
WHERE
r.returned IS NULL
GROUP BY
o.customer_id, o.customer_name
ORDER BY
sum(o.sales) DESC
LIMIT 10
),
/* ユーザープロンプト生成 */
user_prompts AS (
SELECT
customer_id,
customer_name,
LISTAGG(replace(product_name, ',', ''),',') AS purchase_history,
customer_name||'さんは、過去に'||purchase_history||'などを購入しています。このお客様に嗜好を分析して他に商品をおすすめする文章を作成してください。' AS customer_prompt
FROM orders
WHERE customer_id IN (SELECT * FROM top10_customer_ids)
GROUP BY customer_id, customer_name
)
/* リコメンドの生成 */
SELECT
customer_id,
customer_name,
purchase_history,
customer_recommendations_func(
customer_prompt,
object('temperature', 0.2)
) as recommend_message
FROM user_prompts
;
-[ RECORD 1 ]-----+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
customer_id | SE-20110
customer_name | Sanjit Engle
purchase_history | Dixon Ticonderoga Core-Lock Colored Pencils,File Shuttle II and Handi-File Black,Tennsco Commercial Shelving,Kensington K72356US Mouse-in-a-Box USB Desktop Mouse,HP Designjet T520 Inkjet Large Format Printer - 24 Color,Presstex Flexible Ring Binders,Acrylic Self-Standing Desk Frames,Martin Yale Chadless Opener Electric Letter Opener,Fellowes Mobile File Cart Black,Avery 486,Wilson Jones Turn Tabs Binder Tool for Ring Binders,Logitech G35 7.1-Channel Surround Sound Headset,Maxell 4.7GB DVD-R,OtterBox Commuter Series Case - iPhone 5 & 5s,Kensington 4 Outlet MasterPiece Compact Power Control Center,Executive Impressions 12 Wall Clock,Bretford CR8500 Series Meeting Room Furniture,Eberhard Faber 3 1/2 Golf Pencils,GBC Personal VeloBind Strips
recommend_message | 拝啓 Sanjit Engle様 +
| +
| いつもShinanoをご利用いただき、誠にありがとうございます。 +
| 過去のご購入履歴を拝見させていただき、オフィス用品や文房具、電子機器などを幅広くお求めいただいていることがわかりました。 +
| 効率的な業務環境作りにご関心が高いようですね。 +
| +
| そこで、以下の商品をおすすめさせていただきます: +
| +
| 1. エルゴノミクスデザインのオフィスチェア - 長時間のデスクワークでも快適な姿勢をサポート +
| +
| 2. ノイズキャンセリングヘッドフォン - 集中力を高める静かな環境作りに +
| +
| 3. デュアルモニターアーム - 作業効率アップとデスクスペースの有効活用に +
| +
| 4. ワイヤレス充電器付きデスクオーガナイザー - 整理整頓と便利な充電を一度に +
| +
| 5. スマート電源タップ - 省エネと遠隔操作で電力管理を効率化 +
| +
| これらの商品は、Engle様の生産性向上とオフィス環境の最適化にお役立ていただけると確信しております。 +
| ご検討いただければ幸いです。ご不明な点がございましたら、お気軽にお問い合わせください。 +
| +
| 今後ともShinanoをよろしくお願いいたします。 +
| +
| 敬具 +
| +
| Shinano営業部
-[ RECORD 2 ]-----+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
:
:
(中略)
:
:
| ご不明な点やご質問がございましたら、いつでもお気軽にお問い合わせください。今後ともShinanoをよろしくお願いいたします。 +
| +
| 敬具 +
| +
| Shinano営業担当
時間: 13566.881 ミリ秒(00:13.567)
dev=#
追加のカスタマイズオプション
リーダーノードのみで推論関数を実行
テーブルを参照しないクエリの場合、Amazon Bedrockモデル推論関数をリーダーノードのみで実行できます。これは、LLMに質問を素早く尋ねたい場合に役立ちます。
テーブルを参照しないクエリの例として、上記のcustomer_recommendations_func()関数の動作確認で「おはようございます!」と入力して実行しています。
UNIFIED リクエストタイプモデルによる推論
このモードでは、入力テキストとともに追加のオプション ラメータを渡して、応答をカスタマイズできます。Amazon Redshift は、これらのパラメータを Converse API の対応するパラメータに渡します。
温度パラメータをカスタム値に設定する例として、上記でobject('temperature', 0.2)
と指定しています。(本来は、さらに Few-Shot Prompting なども考慮すべきですが、あまり頑張りすぎると本来紹介したいことから離れるため自重しました。)
:
:
/* リコメンドの生成 */
SELECT
customer_id,
customer_name,
purchase_history,
customer_recommendations_func(
customer_prompt,
object('temperature', 0.2)
) as recommend_message
FROM user_prompts
;
RAWリクエスト型モデルによる推論
Amazon Bedrock Converse APIでサポートされていないAmazon Bedrockホステッドモデルもサポートされています。この場合、request_type
をraw
に設定し、推論時にリクエストを構築する必要があります。
RESPONSE_TYPE を SUPER として実行メトリクスをFetchする
入力トークン、出力トークン、レイテンシーメトリクスなど、入力リクエストに関する詳細情報が必要な場合は、モデル作成時にRESPONSE_TYPE
をsuper
に設定できます。
制限事項とベストプラクティス
- Amazon Bedrockの限られたランタイムクォータにより、推論クエリがスロットリング例外を生成する可能性があります。
- 異なるAWSリージョンでAmazon Bedrockが提供する異なるモデルのランタイムクォータにより、推論クエリのスループットが制限されます。
- 安定した一貫したスループットが必要な場合は、Amazon Bedrockからモデルのプロビジョニングされたスループットの取得を検討してください。
- Amazon Redshift MLとAmazon Bedrockの使用には追加コストがかかります。コストはモデルとリージョンに固有であり、モデルが処理する入力および出力トークンの数に依存します。
最後に
今回は、実際のユースケースをイメージできるように、お客様に合わせた「商品のご提案」を生成する、Amazon Redshiftのデータを利用したRAG(Retrieval-Augmented Generation)の例になります。
RAG(Retrieval-Augmented Generation)は、生成AIの精度と信頼性を向上させる技術です。従来の大規模言語モデル(LLM)に、外部情報の検索機能を組み合わせることで、最新情報や特定のドメイン知識を反映した回答を生成できます。
基盤モデルは常にリソースが潤沢にあるとは限りませんので、考慮事項と最良の実践を念頭に置いて、Amazon RedshiftとAmazon Bedrockの統合を活用することで、効果的な生成AIアプリケーションを構築してください。
合わせて読みたい